package Exception;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * ClassName:Abnormal001
 * Package:Abnormal
 * Description:
 *
 * @Author:ZhangXin
 * @Create2023/2/25-20:34
 * @Version:v1.0
 */
public class ExceptionDome001 {
    /*异常:异常就是代表程序出现的问题
    *
    * 异常的分类
    * Java.lang.Throwable
    * 1.Error:代表的系统级别错误(属于严重问题)
    * 2.Exception:异常,代表程序可能出现的问题
    *               我们通常会用Exception以及他的子类来封装程序出现的问题
    *     a.运行时异常:RuntimeException本身及其所有子类,编译阶段不会出现异常提醒
    *                运行时出现的异常(如:数组索引越界异常),一般是由于参数传递错误带来的问题
    *     b.编译时异常:编译阶段就会出现异常提醒的(如:日期解析异常)
    *
    * 异常的作用
    * 作用一:异常是用来查询bug的关键参考信息
    * 作用二:异常可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况
    *
    * 异常的处理方式
    * 1.JVM默认的处理方式
    * 2.自己处理
    * 3.抛出异常(交给调用者处理)*/
    /**
     * 灵魂四问
     * 1.如果try中没有发现问题,怎么执行？
     *      会把try里面所有的代码全部执行完毕不会执行catch里面的代码
     * 2.如果try中可能遇到多个问题,怎么执行?
     *      会写多个catch与之对应,父类异常需要写下下面
     * 3.如果try中遇到的问题没有被捕获,怎么执行?
     *      相当于try...catch白写了,当前异常会交给虚拟机处理
     * 4.如果try中遇到了问题,那么try下面的其他代码还会执行吗?
     *      不会执行,try中遇到问题,直接跳转到对应的catch,如果没有对应的catch对应与之匹配
     *      则交给虚拟机处理
     */
    public static void main(String[] args) throws ParseException {

        //编译时异常(在编译阶段,必须要手动处理,否则代码报错)
        String time = "2003年1月1日";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
        Date date = sdf.parse(time);
        System.out.println(date);

        //运行时期日常(在编译阶段是不需要处理的,是代码运行时出现的异常)
        int[]arr={1,2,3};
        System.out.println(arr[3]);//ArrayIndexOutOfBoundsException数组索引越界异常
    }

}
/*
*       Java文件
*          |
*          | Java命令     编译时异常:编译阶段就要进行处理的异常(如:日期解析异常)
*          |               Java不会运行代码,只会检查语法是否错误,或者做一些性能优化
*       字节码文件
*          |
*          | Java命令     运行时异常:RuntimeException及其子类,编译阶段不会出现异常提醒
*          |                      运行时出现的异常(如:数组索引越界异常)
*       运行结果*/